package com.bytecodezz.javacase.cacheling;

import java.util.concurrent.CountDownLatch;

/**
 * 要点：
 * 1、CountDownLatch 用法
 * 2、缓存行（页）存在证明方法 （一般缓存行为64字节）
 * 3、缓存一致性协议（实现方式是硬件级别的协议通信，一个缓存行里的数据被修改了，会通知其他内核重新加载这一行数据，比如我们有x1,x2在同一行，线程1需要修改x1，线程2需要修改x2，如果线程1先修改x1，则会通知线程2重新加载这一行数据）
 * 测试结果 10亿次 约 40秒
 */
public class CacheLinePaddingTest1 {
    // 设置循环十亿次
    public static final long COUNT = 10_0000_0000L;

    private static class T {
        // 定义一个类的全局变量为long类型的x，long占用8个字节
        public volatile long x = 0L;
    }

    private static T[] arr = new T[2];

    static {
        arr[0] = new T();
        arr[1] = new T();
    }

    public static void main(String[] args) throws InterruptedException {
        // 多线程辅助类，初始化配置 count 值
        // 重要方法: await() 调用该方法，如果count不为0，则挂起当前线程
        // 重要方法: await(long, TimeUnit) 如果count不为0则挂起当前线程，如果超过给定时间还是不为0，则恢复
        // 重要方法: countDown() 将 count 数值-1
        CountDownLatch latch = new CountDownLatch(2);

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < COUNT; i++) {
                arr[0].x = i;
            }
            latch.countDown();
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < COUNT; i++) {
                arr[1].x = i;
            }
            latch.countDown();
        });

        final long startTime = System.nanoTime();
        t1.start();
        t2.start();
        // 等待其他2个线程执行结束
        latch.await();
        // 输出执行时间
        System.out.println((System.nanoTime() - startTime) / 100_0000 + " ms");
    }
}


